//最⻓递增⼦序列的个数（medium）： https://leetcode.cn/problems/number-of-longest-increasing-subsequence/
class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n = nums.size();
        vector<int> len(n, 1), count(n, 1); // 1. 创建 dp 表 + 初始化
        int retlen = 1, retcount = 1;       // 记录最终结果
        for (int i = 1; i < n; i++)         // 2. 填表
        {
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i]) {
                    if (len[j] + 1 == len[i])
                        count[i] += count[j];
                    else if (len[j] + 1 > len[i]) // 重新计数
                        len[i] = len[j] + 1, count[i] = count[j];
                }
            }
            if (retlen == len[i])
                retcount += count[i];
            else if (retlen < len[i]) // 重新计数
                retlen = len[i], retcount = count[i];
        }
        // 3. 返回结果
        return retcount;
    }
};


最⻓数对链（medium）： https://leetcode.cn/problems/maximum-length-of-pair-chain/
class Solution {
public:
    1 2 3 比特就业课 int findLongestChain(vector<vector<int>>& pairs) {
        sort(pairs.begin(), pairs.end()); // 排序
        int n = pairs.size();
        vector<int> dp(n, 1); // 创建 dp数组，顺便初始化
        int ret = 1;          // 记录最⼤值
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                // 找出所有情况下的最⼤值
                if (pairs[j][1] < pairs[i][0])
                    dp[i] = max(dp[i], dp[j] + 1);
            }
            ret = max(ret, dp[i]); // 更新最⼤值
        }
        return dp[n - 1];
    }
};